package com.acmen.easyapi.generator;

import com.acmen.easyapi.annotation.Param;
import com.acmen.easyapi.util.IdNoUtil;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * @author acmen
 * 身份证号数据生成器
 */
@Component
public class IDnoDataGenerator implements DataGenerator {
    /**
     * 判断字段是否匹配生成身份证号数据
     *
     * @param field  字段对象
     * @param param  参数对象
     * @return       如果字段名与"idno"大小写不敏感相等，或者参数的标签以"身份证号"结尾，返回true；否则返回false
     */
    @Override
    public boolean matches(Field field, Param param) {
        // 如果字段名与"idno"大小写不敏感相等，则返回true
        if (field.getName().equalsIgnoreCase("idno")) {
            return true;
        }
        // 如果参数的标签以"身份证号"结尾，则返回true
        if (param.label().endsWith("身份证号")) {
            return true;
        }
        // 其他情况返回false
        return false;

    }

    /**
     * 生成身份证号数据
     *
     * @param field  字段对象
     * @param param  参数对象
     * @return       如果字段类型为数组或者可分配给Collection类，则返回一个包含随机身份证号码的List对象；否则返回一个随机身份证号码
     */
    @Override
    public Object generate(Field field, Param param) {
        // 判断字段类型是否为数组或者可分配给Collection类
        if (field.getType().isArray() || Collection.class.isAssignableFrom(field.getType())) {
            // 创建一个List对象
            List datas = new ArrayList();
            // 循环3次，向List中添加随机身份证号码
            for (int i = 0; i < 3; i++) {
                datas.add(IdNoUtil.randomIdNo());
            }
            // 返回List对象
            return datas;
        } else {
            // 返回一个随机身份证号码
            return IdNoUtil.randomIdNo();
        }

    }

    /**
     * 获取数据生成说明
     *
     * @return       返回身份证号的数据生成说明
     */
    @Override
    public String getNote() {
        return "身份证号：当字段名为'idno'或者@ReqParam.name为'身份证号'时，随机生成一个身份证号。";
    }

}
